﻿#define  _CRT_SECURE_NO_WARNINGS 1


//1. 李四在写排序时，经常需要交换两个元素的值。但手动写出来显得代码不够优雅，李四是一个有品味的人，
//他希望有一个函数能实现两个值的交换。
//实现 swap 函数 该函数可以交换指针指向的值
///*
//功能: 交换两个指针指向的整数值
//参数:
//int *a: 待交换变量 1 的地址
//int *b: 待交换变量 2 的地址
//返回值:
//void
//*/
//void swap(int* a, int* b);
//测试样例:
//int main() {
//	int a = 3, b = 4;
//	swap(&a, &b);
//	printf("%d,%d\n", a, b); //此处应打印 4,3
//}
#include <stdio.h >
//// 定义swap函数，接收两个int类型的指针作为参数
//void swap(int* a, int* b)
//{
//	// 定义临时变量temp，用于暂存其中一个变量的值（避免交换数据覆盖）
//	int temp = 0;
//	// 通过指针解引用，获取a指向的变量的值，存入temp变量
//	temp = *a;
//	// 将b指向变量的值赋给a指向变量的值
//	// 此时a原数据已存在temp中，不会丢失
//	*a = *b;
//	// 将temp中暂存的a原数据，赋给b指向的变量，完成交换
//	*b = temp;
//}
//int main()
//{
//	int a = 3;
//	int b = 4;
//	swap(&a, &b);
//	printf("%d,%d\n", a, b);
//	return 0;
//}



//2. 王五在写代码时遇到了问题，但他不知道是怎么回事，大家快帮帮他吧.
//修正 fun 函数的代码 :
//int* fun() {
//	int a[] = { 3,4,5,6 };
//	return a;
//}
//int main()
//{
//	int* b = fun();
//	int c = (int)malloc(16); // include <stdlib.h>
//	printf("%d", b[0]);
//}
#include <stdlib.h>
// 修正后的fun函数：使用动态内存分配，避免返回局部变量地址
//int* fun()
//{
//	// 动态分配4个int类型的内容（16字节与原数组大小一样）
//	// 动态内容在函数结束后不会自动释放，需要手动
//	int* a = (int*)malloc(4 * sizeof(int));
//	if (a == NULL)
//	{ // 检查内存分配是否成功（避免分配失败导致的错误）
//		printf("内存分配失败\n");
//		return NULL;
//	}
//	// 位动态数组赋值（模拟原数组数据）
//	a[0] = 3;
//	a[1] = 4;
//	a[2] = 5;
//	a[3] = 6;
//	return a;  // 返回动态分配的数组地址（安全）
//}
//int main()
//{
//	int* b = fun(); // 接受fun函数返回的动态数组地址
//	if (b == NULL)
//	{
//		// 检查是否成功获取数组（避免使用空指针）
//		return 1; // 分配失败时退出程序
//	}
//	// 原代码中malloc（16）的内存未使用，删除避免内存泄漏
//	// int 从=（int）malloc（16）
//	printf("%d", b[0]); // 输入数组的第一个元素（此时访问的是有效内存）
//	free(b); // 释放动态分配的内存（避免内存泄露）
//	b = NULL; // 将指针置空，避免变成野指针
//	return 0;
//}



//3. 删除重复值
//阿伟学长在开发一款游戏，他希望玩家已经获得的道具会降低爆率，避免玩家获得太多重复的道具
//但玩家背包中道具是乱序且不确定的，为了减小判断的运算量，需要先对数据进行去重.
//设计一个程序，输入数据数量N，以及N个整数Ni.将该组数据去重后打印
//(1 < N < 100, 0 <= Ni <= MAX_INT)
//	样例输入:
//10
//1 3 2 6 2 6 4 8 2 6
//样例输出 :
//	1 3 2 6 4 8

// 自定义函数：判断元素是否已在目标数组中存在
//参数：目标数组，数组当前长度，待判断的元素
int isExist(int target[], int len, int num)
{
	for (int i = 0; i < len; i++)
	{
		// 遍历数组已有的所有元素
		if (target[i] == num)
		{//如果找到相同元素
			return 1;  // 返回1表示已存在
		}
	}
	return 0; // 遍历结束，未找到返回0表示不存在
}

int main()
{
	int N = 0;  //存储输入的数据数量
	printf("请输入数据数量N：");
	scanf("%d", &N); // 读取用户输入的N

	int input[99];  // 用于存储输入的数据
	printf("请输入%d个整数: ", N);
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &input[i]);
	}
	int result[99]; // 存储去重的数据
	int resultLen = 0; // 记录结果数组当前的长度（初始0）

	for (int i = 0; i < N; i++)
	{
		// 检查当前元素是否已经在结果数组中
		if (!isExist(result, resultLen, input[i]))
		{
			result[resultLen] = input[i]; // 不存在则加入结果数组
			resultLen++; // 结果数组长度+1
		}
	}
	printf("去重的结果: ");
		for (int i = 0; i < resultLen; i++)
		{
			printf("%d ", result[i]);
		}
		printf("\n");
}